home *** CD-ROM | disk | FTP | other *** search
/ The CDPD Public Domain Collection for CDTV 4 / CDPD_IV.bin / e / mailinglists / amigae.0793july.archive / 000077_crash!kirk.safb.af.mil!BWILLS_Mon, 26 Jul 93 15:51:18 PST.msg < prev    next >
Internet Message Format  |  1994-05-26  |  4KB

  1. Received: by bkhouse.cts.com (V1.16/Amiga)
  2.     id AA00000; Mon, 26 Jul 93 15:51:18 PST
  3. Received: from kirk.safb.af.mil by crash.cts.com with smtp
  4.     (Smail3.1.28.1 #15) id m0oKZh9-0000aRC; Mon, 26 Jul 93 14:02 PDT
  5. Message-Id: <m0oKZh9-0000aRC@crash.cts.com>
  6. Date: 26 Jul 93 16:00:00 CST
  7. From: "Barry D. Wills" <BWILLS@kirk.safb.af.mil>
  8. To: "amigae" <amigae@bkhouse.cts.com>
  9. Subject: re: request for 2d arrays
  10.  
  11.  
  12. ---  CUT HERE  -------------------------------------------------------------
  13.  
  14. /*========================================================================*/
  15. /*                                                                        */
  16. /* 2D array in E.  It's as easy as this.                                  */
  17. /*                                                                        */
  18. /* User components are:                                                   */
  19. /*   dd_arrayType and the components therein                              */
  20. /*   dd_dim (), create the 2d array                                       */
  21. /*   dd_set (), put a value into an element of the 2d array               */
  22. /*   dd_get (), get a value from an element of the 2d array               */
  23. /*                                                                        */
  24. /* The other components of this module should not be useful.              */
  25. /*                                                                        */
  26. /*========================================================================*/
  27.  
  28.  
  29. RAISE 0 IF CtrlC () = TRUE
  30. /* You should define an error trap for New()=NIL. */
  31.  
  32.  
  33. OBJECT dd_arrayType
  34.   iUBound, jUBound, elSize, elements
  35. ENDOBJECT
  36.  
  37.  
  38. /* These are global to speed up array access. */
  39. DEF dd_ar : PTR TO dd_arrayType,
  40.     dd_charPtr : PTR TO CHAR,
  41.     dd_intPtr : PTR TO INT,
  42.     dd_longPtr : PTR TO LONG,
  43.     dd_elSize
  44.  
  45.  
  46. PROC dd_dim (i, j, elSize)
  47.   IF (elSize <> 1) AND
  48.      (elSize <> 2) AND
  49.      (elSize <> 4) THEN Raise ('Invalid element size.')
  50.   dd_ar := New (SIZEOF dd_arrayType)
  51.   dd_ar.elements := New (i*j*elSize)
  52.   dd_ar.iUBound := i - 1
  53.   dd_ar.jUBound := j - 1
  54.   dd_ar.elSize := elSize
  55. ENDPROC  dd_ar
  56.  
  57.  
  58. PROC checkBounds (i, j)
  59.   /* dd_ar already points to array when this is called. */
  60.   IF (i < 0) OR (i > dd_ar.iUBound) THEN Raise ('"i" subscript out of bounds.')
  61.   IF (j < 0) OR (j > dd_ar.jUBound) THEN Raise ('"j" subscript out of bounds.')
  62. ENDPROC  TRUE
  63.  
  64.  
  65. PROC dd_offset (i, j) RETURN ((i * (dd_ar.jUBound + 1) + j) * dd_elSize)
  66.  
  67.  
  68. PROC dd_set (array, i, j, value)
  69.   dd_ar := array
  70.   checkBounds (i, j)
  71.   dd_elSize := dd_ar.elSize
  72.   SELECT dd_elSize
  73.     CASE 1
  74.       dd_charPtr := dd_ar.elements
  75.       dd_charPtr [dd_offset (i, j)] := value
  76.     CASE 2
  77.       dd_intPtr := dd_ar.elements
  78.       dd_intPtr [dd_offset (i, j)] := value
  79.     CASE 4
  80.       dd_longPtr := dd_ar.elements
  81.       dd_longPtr [dd_offset (i, j)] := value
  82.   ENDSELECT
  83. ENDPROC
  84.  
  85.  
  86. PROC dd_get (array, i, j)
  87.   DEF value
  88.   dd_ar := array
  89.   checkBounds (i, j)
  90.   dd_elSize := dd_ar.elSize
  91.   SELECT dd_elSize
  92.     CASE 1
  93.       dd_charPtr := dd_ar.elements
  94.       value := dd_charPtr [dd_offset (i, j)]
  95.     CASE 2
  96.       dd_intPtr := dd_ar.elements
  97.       value := dd_intPtr [dd_offset (i, j)]
  98.     CASE 3
  99.       dd_longPtr := dd_ar.elements
  100.       value := dd_longPtr [dd_offset (i, j)]
  101.   ENDSELECT
  102. ENDPROC  value
  103.  
  104.  
  105. PROC dd_dispose (array)
  106.   dd_ar := array
  107.   Dispose (dd_ar.elements)
  108.   Dispose (dd_ar)
  109. ENDPROC
  110.  
  111.  
  112. PROC main () HANDLE
  113.   DEF myArray : PTR TO dd_arrayType,  /* Only needs to PTR TO if you want */
  114.                                       /* access to the OBJECT fields.     */
  115.       xDim = 4, yDim = 4,             /* x and y dimensions.              */
  116.       sizeofChar = 1,                 /* Just for readability.            */
  117.       i, j, val = 0                   /* Loop counters.                   */
  118.  
  119.   /* Create the array. */
  120.   myArray := dd_dim (xDim, yDim, sizeofChar)
  121.  
  122.   /* Put stuff in each element. */
  123.   FOR i := 0 TO myArray.iUBound
  124.     FOR j := 0 TO myArray.jUBound
  125.       CtrlC()
  126.       dd_set (myArray, i, j, val++)
  127.     ENDFOR
  128.   ENDFOR
  129.  
  130.   /* Get it back out. */
  131.   FOR i := 0 TO myArray.iUBound
  132.     FOR j := 0 TO myArray.jUBound
  133.       WriteF ('myArray [\d,\d]=\d\n', i, j, dd_get (myArray, i, j))
  134.     ENDFOR
  135.   ENDFOR
  136.  
  137.   /* Cleanup. */
  138.   dd_dispose (myArray)
  139.  
  140. EXCEPT
  141.   IF exception THEN WriteF ('\s\n', exception)
  142.   CleanUp (exception)
  143. ENDPROC